
#include "./micropython/py/dynruntime.h"

mp_obj_t _GenericAPI_Print;
mp_obj_t _GenericAPI_Input;
mp_obj_t _GenericAPI_Len;
mp_obj_t _GenericAPI_Sum;

static mp_obj_t init_GenericAPI_Print(mp_obj_t func) {
    _GenericAPI_Print = func;
    return mp_obj_new_bool(mp_obj_new_int(1));
}

static mp_obj_t init_GenericAPI_Input(mp_obj_t func) {
    _GenericAPI_Input = func;
    return mp_obj_new_bool(mp_obj_new_int(1));
}

static mp_obj_t init_GenericAPI_Len(mp_obj_t func) {
    _GenericAPI_Len = func;
    return mp_obj_new_bool(mp_obj_new_int(1));
}

static mp_obj_t init_GenericAPI_Sum(mp_obj_t func) {
    _GenericAPI_Sum = func;
    return mp_obj_new_bool(mp_obj_new_int(1));
}

mp_obj_t GenericAPI_Printf(size_t n_args, const mp_obj_t *args) {
    return mp_call_function_n_kw(_GenericAPI_Print, n_args, 0, args);
}

mp_obj_t GenericAPI_Print(mp_obj_t text) {
    mp_obj_t args[1] = {text};
    return mp_call_function_n_kw(_GenericAPI_Print, 1, 0, args);
}

mp_obj_t GenericAPI_InputC(char* prompt) {
    mp_obj_t args[1] = {mp_obj_new_str(prompt, strlen(prompt))};
    return mp_call_function_n_kw(_GenericAPI_Input, 1, 0, args);
}

mp_obj_t GenericAPI_Input(mp_obj_t prompt) {
    mp_obj_t args[1] = {prompt};
    return mp_call_function_n_kw(_GenericAPI_Input, 1, 0, args);
}

mp_obj_t GenericAPI_Len(mp_obj_t obj) {
    mp_obj_t args[1] = {obj};
    return mp_call_function_n_kw(_GenericAPI_Len, 1, 0, args);
}

mp_obj_t GenericAPI_Sum(mp_obj_t iterable, mp_obj_t start) {
    mp_obj_t args[2] = {iterable, start};
    return mp_call_function_n_kw(_GenericAPI_Sum, 2, 0, args);
}

#define CSDK_INIT_GENERICAPI_GLOBALS static MP_DEFINE_CONST_FUN_OBJ_1(O_GA_Pr, init_GenericAPI_Print); static MP_DEFINE_CONST_FUN_OBJ_1(O_GA_In, init_GenericAPI_Input); static MP_DEFINE_CONST_FUN_OBJ_1(O_GA_Ln, init_GenericAPI_Len); static MP_DEFINE_CONST_FUN_OBJ_1(O_GA_Su, init_GenericAPI_Sum);

#define CSDK_EXPORT_GENERICAPI_GLOBALS mp_store_global(MP_QSTR_regGA_Pr, MP_OBJ_FROM_PTR(&O_GA_Pr)); mp_store_global(MP_QSTR_regGA_In, MP_OBJ_FROM_PTR(&O_GA_In)); mp_store_global(MP_QSTR_regGA_Ln, MP_OBJ_FROM_PTR(&O_GA_Ln)); mp_store_global(MP_QSTR_regGA_Su, MP_OBJ_FROM_PTR(&O_GA_Su));